/*
 * @Author: 13177709051 3506463075@qq.com
 * @Date: 2024-12-02 14:31:01
 * @LastEditors: 13177709051 3506463075@qq.com
 * @LastEditTime: 2024-12-02 14:43:30
 * @FilePath: /example/eventfd.c
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
// 简单的秒级定时任务实现：
// 在当前的⾼并发服务器中，我们不得不考虑⼀个问题，那就是连接的超时关闭问题。我们需要避免⼀
// 个连接⻓时间不通信，但是也不关闭，空耗资源的情况。
// 这时候我们就需要⼀个定时任务，定时的将超时过期的连接进⾏释放。

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdint.h>
#include <sys/timerfd.h>

int main()
{
    // int timefd_create(int clockid, int flags);
    int timerfd = timerfd_create(CLOCK_MONOTONIC, 0);
    if (timerfd < 0)
    {
        perror("timerfd_create error");
        return -1;
    }

    // int timerfd_settime(int fd, int flags, struct itimerspec *new, struct itimerspec *old);
    struct itimerspec itime;
    itime.it_value.tv_sec = 1;
    itime.it_value.tv_nsec = 0; // 第一次超时时间为 1s 后
    itime.it_interval.tv_sec = 1;
    itime.it_interval.tv_nsec = 0; // 第一次超时后, 每次超时的时间间隔
    timerfd_settime(timerfd, 0, &itime, NULL);

    while (1)
    {
        uint64_t times;
        int ret = read(timerfd, &times, 8);
        if (ret < 0)
        {
            perror("read error");
            return -1;
        }
        printf("超时了, 距离上一次超时了%ld次\n", times);
    }
    close(timerfd);
    return 0;
}

// #include <sys/timerfd.h>
// int timerfd_create(int clockid, int flags);
// clockid : CLOCK_REALTIME - 系统实时时间，如果修改了系统时间就会出问题； 
// CLOCK_MONOTONIC - 从开机到现在的时间是⼀种相对时间； 
// flags : 0 - 默认阻塞属性 

// int timerfd_settime(int fd, int flags, struct itimerspec *new, struct itimerspec *old);
// fd : timerfd_create返回的⽂件描述符
// flags : 0 -相对时间， 1 - 绝对时间；默认设置为0即可.
// new： ⽤于设置定时器的新超时时间 
// old： ⽤于接收原来的超时时间 

// struct timespec
// {
//     time_t tv_sec; /* Seconds */
//     long tv_nsec;  /* Nanoseconds */
// };
// struct itimerspec
// {
//     struct timespec it_interval; /* 第⼀次之后的超时间隔时间 */
//     struct timespec it_value;    /* 第⼀次超时时间 */
// };
// 定时器会在每次超时时，⾃动给fd中写⼊8字节的数据，表⽰在上⼀次读取数据到当前读取数据期间超 时了多少次。
